class SyncWaterfallHook { // 钩子是同步的
  constructor(args) { // agrs => ['name']
    this.tasks = []
  }
  tap(name, task) {
    this.tasks.push(task)
  }
  call(...args) {

    // 方法一
    /*
    let ret = args // 当前这个函数的返回值
    let index = 0 //当前要先执行第一个
    do{
      ret = this.tasks[index++](ret)
    }while( index < this.tasks.length);
    */
    // 方法二
    
    let [first, ...others] = this.tasks;
    let ret = first(...args)
    others.reduce((a, b) => {
      return b(a)
    }, ret)
    

  }
}

let hook = new SyncWaterfallHook(['name'])
hook.tap('react', function(name) {
  console.log('react', name)
  // return '停止向下执行'
  return 'react ok'
})
hook.tap('node', function(data) {
  console.log('node', data)
  return 'node ok'
})
hook.tap('webpack', function(data) {
  console.log('webpack', data)
  return 'webpack ok'
})
// hook.call('hl2')
hook.call(['hl1', 'hl2'])


